package Day_0223.Spring;

/**
 * @author zxc
 * @date 2023/02/23 21:32
 **/
public class Bean_Life_Cycle {
    public static void main(String[] args) {
        /**
         * Bean生命周期详述
         * ===》
         * 1.BeanFactory完成对于配置文件中所有Bean Definition的生成和注册;
         * （1）将配置信息解析成Bean Definition，同时将其注册到BeanFactory中;
         * （2）生成各种BeanPostProcessor && 将其注册到Bean Factory中;
         *
         * 2.Bean的实例化（Spring代为操作）
         * （1）在Bean进行实例化之前，调用InstantiationAwareBeanPostProcessor中的 BeanProcessBeforeInstantiation方法。
         * （2）在Bean进行实例化之后，调用InstantiationAwareBeanPostProcessor中的 BeanProcessAfterInstantiation方法
         *
         * 3.Bean属性注入（Spring代为操作）
         *
         * 4.生成和注册相关Aware接口的Bean;
         * 5.Aware调用Group1 ：Bean-xxx-Aware;
         * 6.Aware调用Group2 ：在Bean进行初始化之前，调用BeanPostProcessor接口中的PostProcessBeforeInitialization方法;
         * 注意 ：Aware方法的调用，都是在初始化之前被调用;
         *
         * 7.初始化 ：
         * （1）首先，调用InitializingBean接口中的AfterPropertiesSet方法;
         * （2）其次，调用init-method声明的方法，来对于Bean进行初始化;
         *
         * 8.在Bean进行初始化后，调用BeanPostProcessor接口中的PostProcessAfterInitialization方法;
         *
         * 9.销毁 ：
         * （1）首先，调用DisposableBean接口中的destroy方法;
         * （2）其次，执行 destroy-method声明的方法（用来销毁Bean中的各项数据）。
         *
         * ====》
         * 总结
         * Spring Bean的生命周期分为 四个阶段 和 多个扩展点 。扩展点又可以分为 影响多个Bean 和 影响单个Bean 。
         * 1.四个阶段
         * （1）实例化 Instantiation
         * （2）属性赋值 Populate
         * （3）初始化 Initialization
         * （4）销毁 Destruction
         *
         * 2.多个扩展点
         * 1）影响多个Bean
         * （1）BeanPostProcessor
         * （2）InstantiationAwareBeanPostProcessor
         * 2）影响单个Bean
         * Aware：
         * （1）Aware Group1
         *  BeanNameAware
         *  BeanClassLoaderAware
         *  BeanFactoryAware
         *
         * （2）Aware Group2
         *  EnvironmentAware
         *  EmbeddedValueResolverAware
         *  ApplicationContextAware(ResourceLoaderAware\ApplicationEventPublisherAware\MessageSourceAware)
         *
         * 3.生命周期
         * （1）InitializingBean（初始化）
         * （2）DisposableBean（销毁）
         *
         */
    }
}
